home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Very Best of Atari Inside
/
The Very Best of Atari Inside 1.iso
/
mint
/
mgr_2
/
src
/
atari
/
pixel.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-09-16
|
3KB
|
120 lines
/* Copyright (c) 1989 Bellcore
* All Rights Reserved
* Permission is granted to copy or use this program, EXCEPT that it
* may not be sold for profit, the copyright notice must be reproduced
* on copies, and credit should be given to Bellcore where it is due.
* BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
*/
/* $Header: pixel.c,v 1.1 89/05/10 18:21:32 sau Locked $
$Source: /usr/u/sau/mgr/src/dec/RCS/pixel.c,v $
*/
static char RCSid_[] = "$Source: /usr/u/sau/mgr/src/dec/RCS/pixel.c,v $$Revision: 1.1 $";
/*
* set/clear/ or invert a pixel (Portable version) (SAU)
* return current bit setting (i.e. may be used to replace bit_on)
*/
#include "bitmap.h"
#ifdef atarist
#include <linea.h>
#endif
bit_point(map,x,y,op)
register BITMAP *map;
register int x,y;
int op;
{
register int bit; /* dst bit */
register DATA *base; /* dst word */
/* clipping */
#ifndef NOCLIP
if (x<0 || x>BIT_WIDE(map) || y<0 || y>BIT_HIGH(map))
return(-1);
#endif
#ifdef INVERT
/* invert all raster ops */
op = op_invert[15&op];
#endif
x += map->x0;
y += map->y0;
#ifdef atarist
if (IS_SCREEN(map)) {
return scrpoint(map, x, y, op);
}
#endif
base = y * BIT_LINE(map) + (x>>LOGBITS) + (map->data);
bit = GETLSB(MSB,(x & BITS));
switch(OPCODE(op)) {
case OPCODE(SRC):
case OPCODE(SRC | DST):
case OPCODE(SRC | ~DST):
case OPCODE(~0):
*base |= bit;
break;
case OPCODE(~SRC):
case OPCODE(~(SRC|DST)):
case OPCODE(DST & ~SRC):
case OPCODE(0):
*base &= ~bit;
break;
case OPCODE(SRC ^ DST):
case OPCODE(~DST):
case OPCODE(SRC & ~DST):
case OPCODE(~(SRC&DST)):
*base ^= bit;
break;
}
return(*base&bit);
}
#ifdef atarist
scrpoint(map,x,y,op)
register BITMAP *map;
register int x,y;
int op;
{
register int bit; /* dst bit */
extern short *Intin, *Ptsin;
/* clipping */
Ptsin[0] = x;
Ptsin[1] = y;
bit = linea2();
switch(OPCODE(op)) {
case OPCODE(SRC):
case OPCODE(SRC | DST):
case OPCODE(SRC | ~DST):
case OPCODE(~0):
Intin[0] = bit = 0xf; /* set */
break;
case OPCODE(~SRC):
case OPCODE(~(SRC|DST)):
case OPCODE(DST & ~SRC):
case OPCODE(0):
Intin[0] = bit = 0; /* clear */
break;
case OPCODE(SRC ^ DST):
case OPCODE(~DST):
case OPCODE(SRC & ~DST):
case OPCODE(~(SRC&DST)):
bit = linea2(); /* get old bit */
Intin[0] = bit = bit ^ 0xf; /* invert */
break;
default:
bit = linea2();
return bit;
}
linea1(); /* set bit */
return bit;
}
#endif